Najlepszy sposób w asp.net aby wymusić https dla całej witryny?

Około 6 miesięcy temu rozwinąłem stronę, gdzie każde żądanie musiało być przez https. Jedynym sposobem, który w tym czasie mogłem znaleźć, aby upewnić się, że każde żądanie do strony było przez https, było sprawdzenie go w zdarzeniu ładowania strony. Jeśli żądanie nie byłoby nad http, odpowiedziałbym. redirect (" https://example.com")

Czy jest lepszy sposób -- najlepiej jakieś ustawienie w sieci.config?

Author: Cœur, 2008-09-05

15 answers

Proszę użyć HSTS (http Strict Transport Security)

Z http://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
                        redirectType="Permanent" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
                    <match serverVariable="RESPONSE_Strict_Transport_Security"
                        pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" value="max-age=31536000" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

Oryginalna odpowiedź (zastąpiona powyższą w dniu 4 grudnia 2015 r.)

W zasadzie

protected void Application_BeginRequest(Object sender, EventArgs e)
{
   if (HttpContext.Current.Request.IsSecureConnection.Equals(false) && HttpContext.Current.Request.IsLocal.Equals(false))
   {
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"]
+   HttpContext.Current.Request.RawUrl);
   }
}
/ Align = "center" bgcolor = "# e0ffe0 " / cesarz Chin / / align = center / asax.cs (lub global.asax.vb)

Nie znam sposobu na określenie tego w sieci.config

 260
Author: John Boker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-15 16:16:55

Inną rzeczą, którą możesz zrobić, to użyć HSTS zwracając nagłówek "Strict-Transport-Security" do przeglądarki. Przeglądarka musi to obsługiwać (a obecnie to przede wszystkim Chrome i Firefox), ale oznacza to, że po ustawieniu przeglądarka nie będzie wysyłać żądań do witryny przez HTTP, a zamiast tego przetłumaczy je na żądania HTTPS przed ich wydaniem. Spróbuj tego w połączeniu z przekierowaniem z HTTP:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
  switch (Request.Url.Scheme)
  {
    case "https":
      Response.AddHeader("Strict-Transport-Security", "max-age=300");
      break;
    case "http":
      var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
      Response.Status = "301 Moved Permanently";
      Response.AddHeader("Location", path);
      break;
  }
}

Przeglądarki, które nie są świadome HSTS, zignorują nagłówek ale nadal zostanie złapany przez instrukcję switch i wysłany do HTTPS.

 126
Author: Troy Hunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 22:06:02

Moduł IIS7 pozwoli na przekierowanie.

    <rewrite>
        <rules>
            <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
                <match url="(.*)"/>
                <conditions>
                    <add input="{HTTPS}" pattern="^OFF$"/>
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/>
            </rule>
        </rules>
    </rewrite>
 89
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 22:46:14

Dla osób stosujących ASP.NET MVC. Możesz użyć następujących sposobów, aby wymusić SSL / TLS przez HTTPS w całej witrynie na dwa sposoby:

The Hard Way

1-Dodaj RequireHttpsAttribute do filtrów globalnych:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

2-Wymuś tokeny zapobiegające fałszowaniu, aby używać SSL / TLS:

AntiForgeryConfig.RequireSsl = true;

3-Wymagaj plików cookie, aby domyślnie wymagały HTTPS, zmieniając stronę internetową.plik konfiguracyjny:

<system.web>
    <httpCookies httpOnlyCookies="true" requireSSL="true" />
</system.web>

4-Użyj NWebSec.Owin NuGet pakiet i dodać następujący wiersz kodu, aby włączyć Strict Ochrona transportowa przechodzi przez teren. Nie zapomnij dodać dyrektywy Preload poniżej i przesłać swoją witrynę do strony Preload HSTS . Więcej informacji tutaj i tutaj. Zauważ, że jeśli nie używasz OWIN, istnieje sieć.metodę config można przeczytać na stronie NWebSec.

// app is your OWIN IAppBuilder app in Startup.cs
app.UseHsts(options => options.MaxAge(days: 30).Preload());

5-Użyj NWebSec.Pakiet Owin NuGet i dodać następujący wiersz kodu, aby włączyć Przypinanie klucza publicznego (HPKP) w całej witrynie. Więcej informacji tutaj i tutaj .

// app is your OWIN IAppBuilder app in Startup.cs
app.UseHpkp(options => options
    .Sha256Pins(
        "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
        "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
    .MaxAge(days: 30));

6-Dołącz schemat https do dowolnego używanego adresu URL. Content Security Policy (CSP) HTTP header i Subresource Integrity (SRI) Nie grają ładnie, gdy naśladujesz schemat w niektórych przeglądarkach. Lepiej być wyraźnym o HTTPS. np.

<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js"></script>

The Easy Way

Użyj ASP.NET MVC Boilerplate szablon projektu Visual Studio do generowania projektu z tym wszystkim i o wiele więcej wbudowanych. Można również Wyświetl kod na GitHub .

 21
Author: Muhammad Rehan Saeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-01 06:57:21

Jeśli nie jesteś w stanie skonfigurować tego w IIS z jakiegokolwiek powodu, chciałbym zrobić moduł HTTP, który robi przekierowanie dla Ciebie:

using System;
using System.Web;

namespace HttpsOnly
{
    /// <summary>
    /// Redirects the Request to HTTPS if it comes in on an insecure channel.
    /// </summary>
    public class HttpsOnlyModule : IHttpModule
    {
        public void Init(HttpApplication app)
        {
            // Note we cannot trust IsSecureConnection when 
            // in a webfarm, because usually only the load balancer 
            // will come in on a secure port the request will be then 
            // internally redirected to local machine on a specified port.

            // Move this to a config file, if your behind a farm, 
            // set this to the local port used internally.
            int specialPort = 443;

            if (!app.Context.Request.IsSecureConnection 
               || app.Context.Request.Url.Port != specialPort)
            {
               app.Context.Response.Redirect("https://" 
                  + app.Context.Request.ServerVariables["HTTP_HOST"] 
                  + app.Context.Request.RawUrl);    
            }
        }

        public void Dispose()
        {
            // Needed for IHttpModule
        }
    }
}

Następnie skompiluj go do biblioteki DLL, Dodaj jako odniesienie do swojego projektu i umieść go w sieci.config:

 <httpModules>
      <add name="HttpsOnlyModule" type="HttpsOnly.HttpsOnlyModule, HttpsOnly" />
 </httpModules>
 13
Author: FlySwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-06 00:08:47

To co musisz zrobić to:

1) Dodaj klucz wewnątrz web.config, w zależności od serwera produkcyjnego lub etapowego jak poniżej

<add key="HttpsServer" value="stage"/>
             or
<add key="HttpsServer" value="prod"/>

2) wewnątrz Twojej globalnej.plik ASAX dodaj poniższą metodę.

void Application_BeginRequest(Object sender, EventArgs e)
{
    //if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "prod")
    if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "stage")
    {
        if (!HttpContext.Current.Request.IsSecureConnection)
        {
            if (!Request.Url.GetLeftPart(UriPartial.Authority).Contains("www"))
            {
                HttpContext.Current.Response.Redirect(
                    Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://www."), true);
            }
            else
            {
                HttpContext.Current.Response.Redirect(
                    Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://"), true);
            }
        }
    }
}
 5
Author: Chandan Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-07 09:06:43

Jeśli Obsługa SSL nie jest konfigurowalna w Twojej witrynie(np. powinien być w stanie włączyć/wyłączyć https) - możesz użyć atrybutu [RequireHttps] na dowolnym kontrolerze / akcji kontrolera, którą chcesz zabezpieczyć.

 3
Author: yarg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-01 08:20:17

To jest pełniejsza odpowiedź oparta na @Troy Hunt ' s. Dodaj tę funkcję do swojej klasy WebApplication w Global.asax.cs:

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
        // Allow https pages in debugging
        if (Request.IsLocal)
        {
            if (Request.Url.Scheme == "http")
            {
                int localSslPort = 44362; // Your local IIS port for HTTPS

                var path = "https://" + Request.Url.Host + ":" + localSslPort + Request.Url.PathAndQuery;

                Response.Status = "301 Moved Permanently";
                Response.AddHeader("Location", path);
            }
        }
        else
        {
            switch (Request.Url.Scheme)
            {
                case "https":
                    Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
                    break;
                case "http":
                    var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
                    Response.Status = "301 Moved Permanently";
                    Response.AddHeader("Location", path);
                    break;
            }
        }
    }

(aby włączyć SSL w lokalnej kompilacji, włącz ją w Docku właściwości dla projektu)

 3
Author: noelicus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-10 11:57:41

Zależy to również od marki twojego balancera, dla web MUX, musisz poszukać nagłówka http X-WebMux-SSL-termination: true, aby dowiedzieć się, że ruch przychodzący był ssl. szczegóły tutaj: http://www.cainetworks.com/support/redirect2ssl.html

 2
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 08:56:38

Dla @ Joe powyżej, " to daje mi pętlę przekierowania. Zanim dodałem kod działał dobrze. Jakieś sugestie? - Joe Nov 8 '11 at 4:13"

To samo działo się ze mną, a to, co uważam, działo się, to fakt, że przed serwerem internetowym pojawił się load balancer kończący żądanie SSL. Tak więc moja strona internetowa zawsze myślała, że żądanie to "http", nawet jeśli oryginalna przeglądarka zażądała, aby to było "https".

Przyznaję, że jest to trochę trudne, ale to, co działało dla mnie, to zaimplementuj właściwość "JustRedirected", którą mógłbym wykorzystać, aby dowiedzieć się, że osoba została już raz przekierowana. Tak więc, testuję pod kątem konkretnych warunków, które uzasadniają przekierowanie i, jeśli są spełnione, ustawiam tę właściwość (wartość zapisaną w sesji) przed przekierowaniem. Nawet jeśli warunki http / https dla przekierowania są spełnione po raz drugi, pomijam logikę przekierowania i resetuję wartość sesji "JustRedirected" na false. Będziesz potrzebował własnej logiki testu warunkowego, ale oto prosty realizacja nieruchomości:

    public bool JustRedirected
    {
        get
        {
            if (Session[RosadaConst.JUSTREDIRECTED] == null)
                return false;

            return (bool)Session[RosadaConst.JUSTREDIRECTED];
        }
        set
        {
            Session[RosadaConst.JUSTREDIRECTED] = value;
        }
    }
 2
Author: Paul Schroeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 19:46:23

Dorzucę swoje 2 centy. Jeśli masz dostęp po stronie serwera IIS, możesz wymusić HTTPS za pomocą powiązań protokołu. Na przykład masz stronę internetową o nazwie Blah . W IIS można ustawić dwie strony: Bla i Bla (Redirect). Dla Bla skonfiguruj tylko Wiązanie HTTPS (i FTP jeśli musisz, upewnij się, że wymusisz to również przez bezpieczne połączenie). Dla Bla (Redirect) skonfiguruj tylko Wiązanie HTTP. Wreszcie, w http Redirect sekcja dla Blah (Redirect) upewnij się, że ustawiłeś przekierowanie 301 na https://blah.com, z włączonym dokładnym miejscem docelowym. Upewnij się, że każda witryna w IIS wskazuje na to, że jest to własny folder główny, w przeciwnym razie Web.config będzie wszystko spieprzone. Upewnij się również, że w witrynie https została skonfigurowana strona HSTS, aby kolejne żądania przeglądarki były zawsze wymuszane przez HTTPS i nie nastąpiły żadne przekierowania.

 2
Author: Gup3rSuR4c,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 21:56:28

W IIS10 (Windows 10 I Server 2016), począwszy od wersji 1709, istnieje nowa, prostsza opcja włączania HSTS dla witryny.

Microsoft opisuje zalety nowego podejścia tutaj i podaje wiele różnych przykładów, jak zaimplementować zmianę programowo lub bezpośrednio edytując ApplicationHost.plik konfiguracyjny (który jest jak web.config, ale działa na poziomie IIS, a nie na poziomie poszczególnych witryn). ApplicationHost.config można znaleźć w C:\Windows\System32\inetsrv\config.

Przedstawiłem tutaj dwie przykładowe metody, aby uniknąć gnicia linków.

Method 1 - Edytuj ApplicationHost.plik konfiguracyjny bezpośrednio Pomiędzy znacznikami <site> Dodaj tę linię:

<hsts enabled="true" max-age="31536000" includeSubDomains="true" redirectHttpToHttps="true" />

Metoda 2 - Wiersz Poleceń: Wykonaj następujące czynności z podniesionego wiersza polecenia (tzn. prawy klawisz myszy na CMD i uruchom jako administrator). Pamiętaj, aby zamienić Contoso z nazwą swojej witryny, która pojawia się w Menedżerze usług IIS.

c:
cd C:\WINDOWS\system32\inetsrv\
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.enabled:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.max-age:31536000" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.includeSubDomains:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.redirectHttpToHttps:True" /commit:apphost

The inne metody oferowane przez Microsoft w tych artykułach mogą być lepszymi opcjami, jeśli korzystasz ze środowiska hostowanego, do którego masz ograniczony dostęp.

Należy pamiętać, że IIS10 w wersji 1709 jest teraz dostępny w systemie Windows 10, ale w systemie Windows Server 2016 znajduje się na innej ścieżce wydania i nie zostanie wydany jako łatka lub dodatek service pack. Zobacz tutaj po szczegóły dotyczące 1709 roku.

 2
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-25 01:40:01

- > po prostu dodaj [RequireHttps] do publicznej klasy HomeController: Controller.

- > i dodaj GlobalFilters.Filtry.Add (new RequireHttpsAttribute ()); w metodzie 'protected void Application_Start ()' w metodzie Global.asax.plik cs.

Co wymusza użycie całej aplikacji do HTTPS.

 1
Author: Santosh K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-13 17:12:21

Spędziłem jakiś czas szukając najlepszych praktyk, które mają sens i znalazłem następujące, które działały dla mnie perfekcyjnie. Mam nadzieję, że to cię kiedyś uratuje.

Używając pliku konfiguracyjnego (na przykład asp.net strona www) https://blogs.msdn.microsoft.com/kaushal/2013/05/22/http-to-https-redirects-on-iis-7-x-and-higher/

Lub na własnym serwerze https://www.sslshopper.com/iis7-redirect-http-to-https.html

[KRÓTKA ODPOWIEDŹ] Po prostu poniższy kod idzie inside

<system.webServer> 
 <rewrite>
     <rules>
       <rule name="HTTP/S to HTTPS Redirect" enabled="true" 
           stopProcessing="true">
       <match url="(.*)" />
        <conditions logicalGrouping="MatchAny">
        <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
       </conditions>
       <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
        redirectType="Permanent" />
        </rule>
       </rules>
 </rewrite>
 1
Author: Nour Lababidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 21:29:59

Jeśli używasz ASP.NET Core możesz wypróbować pakiet nuget SaidOut.AspNetCore.HttpsWithStrictTransportSecurity.

Następnie wystarczy dodać

app.UseHttpsWithHsts(HttpsMode.AllowedRedirectForGet, configureRoutes: routeAction);

Spowoduje to również dodanie nagłówka HTTP StrictTransportSecurity do wszystkich żądań złożonych przy użyciu schematu https.

Przykładowy kod i dokumentacja https://github.com/saidout/saidout-aspnetcore-httpswithstricttransportsecurity#example-code

 0
Author: user7755300,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 06:56:45